const crypto = require('crypto');

/**
 * 生成下载令牌
 * @param {number} length - 令牌长度，默认为32
 * @returns {string} 生成的令牌
 */
exports.generateToken = (length = 32) => {
  return crypto.randomBytes(length).toString('hex');
};

/**
 * 生成带有过期时间的下载令牌
 * @param {number} expiryHours - 过期时间（小时），默认为24
 * @returns {Object} 包含令牌和过期时间的对象
 */
exports.generateTokenWithExpiry = (expiryHours = 24) => {
  const token = exports.generateToken();
  const expiry = new Date(Date.now() + expiryHours * 60 * 60 * 1000);
  
  return {
    token,
    expiry
  };
};

/**
 * 验证令牌是否过期
 * @param {Date} tokenExpiry - 令牌过期时间
 * @returns {boolean} 如果令牌未过期返回true，否则返回false
 */
exports.isTokenValid = (tokenExpiry) => {
  if (!tokenExpiry) return false;
  return new Date() < new Date(tokenExpiry);
};

/**
 * 生成安全的随机字符串
 * @param {number} length - 字符串长度，默认为16
 * @returns {string} 生成的随机字符串
 */
exports.generateSecureString = (length = 16) => {
  const bytes = crypto.randomBytes(length);
  const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  
  for (let i = 0; i < length; i++) {
    result += charset[bytes[i] % charset.length];
  }
  
  return result;
};

/**
 * 生成带有前缀的唯一标识符
 * @param {string} prefix - 标识符前缀
 * @returns {string} 生成的唯一标识符
 */
exports.generateIdentifier = (prefix = '') => {
  const timestamp = Date.now().toString(36);
  const randomStr = Math.random().toString(36).substring(2, 8);
  return `${prefix}${timestamp}${randomStr}`.toUpperCase();
};